template<size_t N, class K = std::string,class Hash1 = HashBKDR,class Hash2 = HashAP,class Hash3 = HashDJB>
//后面几个是字符串哈希函数的仿函数
class BloomFilter
{
public:
	void Set(const K& key)
	{
		//Hash1 hf1;
		//size_t i1 = hf1(key);//以下写法也可以
		size_t i1 = Hash1()(key) % N;//Hash1()是仿函数的匿名对象
		size_t i2 = Hash2()(key) % N;
		size_t i3 = Hash3()(key) % N;
 
		cout << i1 << " " << i2 << " " << i3 << endl;
 
		_bitset.Set(i1);
		_bitset.Set(i2);
		_bitset.Set(i3);
	}
 
	bool Test(const K& key)//判断是否存在
	{
		size_t i1 = Hash1()(key) % N;
		if (_bitset.Test(i1) == false)
		{
			return false;
		}
 
		size_t i2 = Hash2()(key) % N;
		if (_bitset.Test(i2) == false)
		{
			return false;
		}
 
		size_t i3 = Hash3()(key) % N;
		if (_bitset.Test(i3) == false)
		{
			return false;
		}
 
		// 这里3个位都在，有可能是其他key占了，在是不准确的，存在误判
		// 不在是准确的
		return true;
	}
 
private:
	byh::BitSet<N> _bitset; // 对位图的封装
	//byh::vector<char> _bitset;
};
